package com.itheima.sh.test;

import com.itheima.sh.dao.UserMapper;
import com.itheima.sh.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.BeforeClass;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MybatisTest01 {
    private static UserMapper mapper = null;
    private static UserMapper mapper2 = null;
    private static SqlSession sqlSession = null;

    @BeforeClass
    public static void beforeClass() throws Exception {
        //1.创建工厂创造类对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //2.获取工厂对象
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sessionFactory = builder.build(is);
        //3.创建会话对象
        sqlSession = sessionFactory.openSession(true);
        SqlSession sqlSession2 = sessionFactory.openSession(true);
        //4.获取接口的动态代理对象
        mapper = sqlSession.getMapper(UserMapper.class);
        mapper2 = sqlSession2.getMapper(UserMapper.class);
    }

    /*
        User queryUserById(@Param("id") Long id);
        一级缓存：
        1.属于sqlSession级别的，第一次查询从数据库服务器中查询，然后将查询的内容放到本地的一级缓存中
        如果下次使用同一个sqlSession并且查询相同内容则从一级缓存中命中

        2.让一级缓存失效的情况：
            1）查询条件不一致
            2）在第一次执行完查询之后执行增删改语句,清空一级缓存
            3) 不同的sqlSession
            4）使用sqlSession对象调用方法清空一级缓存

       3.让二级缓存失效的情况：
            在第一次执行完查询之后执行增删改语句,清空一级缓存
     */
    @Test
    public void queryUserById() {

        User user = mapper.queryUserById(1L);
        System.out.println("user = " + user);

        //在第一次执行完查询之后执行增删改语句 ,清空一级缓存

//        mapper.deleteUserById(30L);
        //清空一级缓存
//        sqlSession.clearCache();
        //关闭第一个sqlSession
        sqlSession.close();
        mapper2.deleteUserById(100L);

        User user2 = mapper2.queryUserById(1L);
        System.out.println("user2 = " + user2);
    }


}
